package demo1;

import sun.applet.Main;

import java.util.Arrays;
import java.util.Scanner;

//对于上部分的深拷贝与浅拷贝，我们会在后续的数据结构经常会使用序列化和反序列化来实现
//内部类：
//当一个事物的内部，还有一个部分需要一个完整的结构进行描述，而这个内部的完整的结构又只为外部事物提供服
//务，那么这个内部的完整结构最好使用内部类。
//定义：
//在 Java 中，可以将一个类定义在另一个类或者一个方法的内部，
//前者称为内部类，后者称为外部类。内部类也是封装的一种体现。
//有四种内部类：普通、静态、实例、匿名 总共四种内部类；使用频率：实例>静态>匿名>普通内部类
//内部类：指的是定义在方法中的内或者普通类中的内部的类叫做内部类

//在我们平时描述内部类时，要描述什么样的内部类

/*
class A{

}
class B{


}
这种不是内部类
*/
class OutClass{//普通类
    //实例内部类
    class InnerClass{

    }

    //静态内部类
    static class InnerClass2{

    }
}
//我们要记住一个类就要有一个字节码文件
//内部类的字节码文件的名字是： 外部类类名$内部类类名  外部类类名$数字
interface A{
    void testA();
}
public class Test {
    public static void main(String[] args) {
        //以下代码可以认为：有一个类 实现了A接口，并且重写A接口中的方法
        new A(){
            @Override
            public void testA() {
                System.out.println("哈哈！");
            }
        }.testA();//这种就是匿名内部类：这种类没有名字

        /*.testA()在尾大括号后加上，去调用这个匿名内部类*/


        int val = 10;
        /*val = 100;//如果我们要去修改val的值，可是这个时候有我们会发现它报错！，不论在这个main方法里*/
        A a = new A() {
            @Override
            public void testA() {
                System.out.println("值：" + val);//在匿名内部类当中 能够访问的是 没有被修改过的数据 ---> 变量的捕获（专业术语）
                //默认在这里能访问的是被final修饰的变量
            }
        };
        a.testA();//去定义一个接口，去实现这个方法，但是我们依旧发现了这个类没有名字
        //正常类应该有class来定义，这里面的类没有用class来定义

        /*System.out.println(val);*/
    }
}
